/**
 * 21/03/2012
 */

package l3.info.Projet.Client;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.NotBoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * JDialog permettant d'ajouter un utilisateur que l'on veut suivre
 * @author Loïc Martinez
 * @version 1.0
 */

public class JDAjoutSuivi extends JDialog implements ActionListener {

    /** Constantes */
    private static final String TITRE = "Ajout d'un nouvel" +
            " utilisateur à suivre";
    private static final String AJOUTER = "Ajouter";
    private static final String ANNULER = "Annuler";
    private static final int LARGEUR = 290;
    private static final int HAUTEUR = 110;
    private static final int ABSCISSE = 480;
    private static final int ORDONNEE = 280;
    private static final int ANNULER_VALUE = -4;

    /** Composants de la JDialog */
    private JLabel label;
    private JTextField field;
    private JButton boutonAjout, boutonAnnuler;
    private JPanel panLabel, panBouton;

    /** Valeur du id par défaut */
    private int id = ANNULER_VALUE;

    private List<Integer> utilisateurDejaSuivi;

    /** D'id de l'utilisateur connecté */
    private int myId;

    /** La HashMap */
    private Map<Integer, String> idPseudoSuivi;

    /**
     * Constructeur par défaut
     */
    public JDAjoutSuivi(int myId, List<Integer> utilisateurDejaSuivi) {
        this.myId = myId;
        this.utilisateurDejaSuivi = utilisateurDejaSuivi;
        idPseudoSuivi = new HashMap<Integer, String>();
        setProperties();
        addComponents(FlowLayout.CENTER, "Numéro d'utilisateur");
        setEnter();
        setVisible(true);
    }

    /**
     * Configuration des propriétés de la JFrame
     */
    private void setProperties() {
        setTitle(TITRE);
        setBounds(ABSCISSE, ORDONNEE, LARGEUR, HAUTEUR);
        setResizable(false);
        setModal(true);
        getContentPane().setLayout(new FlowLayout());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    /**
     * Ajout du label et du bouton
     * @param alignement, la position des éléments
     * @param textLabel, la valeur du JLabel
     */
    private void addComponents(int alignement, String textLabel) {
        panLabel = new JPanel(new FlowLayout(alignement));
        panLabel.setPreferredSize(new Dimension(LARGEUR, 30));
        label = new JLabel(textLabel);
        panLabel.add(label);

        field = new JTextField(10);
        panLabel.add(field);

        add(panLabel);

        panBouton = new JPanel(new FlowLayout(alignement));
        panBouton.setPreferredSize(new Dimension(LARGEUR, 50));
        boutonAjout = new JButton(AJOUTER);
        boutonAjout.addActionListener(this);

        panBouton.add(boutonAjout);

        boutonAnnuler = new JButton(ANNULER);
        boutonAnnuler.addActionListener(this);

        panBouton.add(boutonAnnuler);

        add(panBouton);
    }

    /**
     * Si on appuie sur Entrée, alors ça déclenche le listener
     * du bouton boutonAjout
     */
    public void setEnter() {
        getRootPane().setDefaultButton(boutonAjout);
    }

    /**
     * @return l'id entré si valide, -1 sinon
     */
    public int getId() {
        return id;
    }

    public Map<Integer, String> getIdAndPseudo() {
        return idPseudoSuivi;
    }

    /**
     * Quand l'on créé un évènement
     * @param ev, l'évènement déclenché
     */
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == boutonAjout) {
            if (field.getText().length() == 0) {
                new JDError("Champ vide !");
                field.setText("");
                // On remet le focus sur le champ Id
                field.requestFocusInWindow();
            } else {

                // id = -4 par défaut
                // idPseudoSuivi.put(id, null);

                try {
                    id = Integer.parseInt(field.getText());
                    if (utilisateurDejaSuivi.contains(id)) {
                        idPseudoSuivi.put(-1, null);
                    } else if (id == myId) {
                        idPseudoSuivi.put(-2, null);
                    } else {
                        // L'ajouter, si il existe pas dans la bd,
                        // S'il existe déjà, -3
                        // Si on retourne null (un string)
                        RequetesClient rClient = new RequetesClient();

                        String pseudoSuivi =
                                rClient.envoyerNumUtilisateur(myId, id);

                        if (pseudoSuivi == null) {
                            // L'utilisateur n'existe pas
                            idPseudoSuivi.put(-3, null);
                        } else {
                            idPseudoSuivi.put(id, pseudoSuivi);
                        }
                    }
                    dispose();
                } catch (NumberFormatException e) {
                    new JDError("L'identifiant doit être un entier !");
                    field.setText("");
                    // On remet le focus sur le champ Id
                    field.requestFocusInWindow();
                } catch (NotBoundException ex) {
                    // TODO Auto-generated catch block
                    ex.printStackTrace();
                }
            }
        } else if (ev.getSource() == boutonAnnuler) {
            dispose();
        }
    }

}
